package com.jchen.common.handle;

import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.jchen.common.util.R;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @Description Sentinel统一异常处理
 * @Author jchen
 * @Date 2023/12/8 11:55
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 流控规则全局异常处理
     *   资源方法签名上需要有异常抛出声明 throws Exception 细粒度的 BlockException 及子类也可以
     * @return
     */
    @ExceptionHandler(FlowException.class)
    public R handleFlowException() {
        return R.failed("服务器开小差了，请稍后再试");
    }

    /**
     * 熔断降级规则全局异常处理
     *   资源方法签名上需要有异常抛出声明 throws Exception 细粒度的 BlockException 及子类也可以
     * @return
     */
    @ExceptionHandler(DegradeException.class)
    public R handleDegradeException() {
        return  R.failed("系统开小差，请稍后重试");
    }

    /**
     * 权限规则全局异常处理
     * @return
     */
    @ExceptionHandler(AuthorityException.class)
    public R handleAuthorityException() {
        return  R.failed("没有权限访问");
    }

    /**
     * 未知异常处理
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public R handleException(Exception e) {
        e.printStackTrace();
        return R.failed("系统错误");
    }
}
